#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define H_W_Y

const int N=5e5+5;
int n,m;
ll a,b;
vector<int> G[N];

namespace Sub1{

  vector<int> jp[N];
  bool vis[N],cd[N];
  int dis[N],dep[N];
  void bfs(){
    queue<int> Q;
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    Q.push(1);

    while(!Q.empty()){
	  int u=Q.front();Q.pop();
	  for(auto v:G[u]){
	    if(dis[v]>dis[u]+1) dis[v]=dis[u]+1,Q.push(v);
	    if(dis[v]==dis[u]+1) cd[v]|=cd[u];
	  }
    }
  }

  void dfs(int u,int fa){
    vis[u]=true,dep[u]=dep[fa]+1;
    for(auto v:G[u]) if(v!=fa)
      if(!vis[v]) dfs(v,u);
  }

  void sol(int u,int fa){
    vector<int> nw;
    for(auto v:G[u]) if(dep[v]<dep[u]){
	  jp[u].pb(v);
	  if(v==fa) continue;
	  int x=u;
	  nw.clear(),nw.pb(u);
	  while(x!=v){
	    int l=0,r=(int)jp[x].size(),res=0;
	    while(l<=r){
		  int mid=(l+r)/2;
		  if(dep[jp[x][mid]]>=dep[v]) res=mid,l=mid+1;
		  else r=mid-1;
	    }
	    x=jp[x][res];
	    nw.pb(x);
	  }
	  if(!((int)nw.size()&1)) continue;
	  int len=(int)nw.size();
	  for(int i=0,j=len/2;i<len;i++,j=(j+1)%len){
	    if(dis[i]==dis[j]+len/2) cd[i]=true;
	    if(dis[j]==dis[i]+len/2) cd[j]=true;
	  }
    }

    sort(jp[u].begin(),jp[u].end(),[&](int x,int y){return dep[x]>dep[y];});
  }

  void init(){
    bfs();
    dfs(1,1);
    sol(1,1);
    bfs();
  }

  void SOLVE(){
    init();
  
    if(b>=2ll*a){
      for(int i=2;i<=n;i++) cout<<1ll*dis[i]*a<<'\n';
	  return ;
    }

    if(b>=a){
	  for(int i=2;i<=n;i++) cout<<(1ll*(dis[i]/2)*b+1ll*(dis[i]%2)*a)<<'\n';
	  return ;
    }

    for(int i=2;i<=n;i++){
	  if(dis[i]%2==0||cd[i]) cout<<1ll*((dis[i]+1)/2)*b<<'\n';
	  else cout<<(1ll*(dis[i]/2)*b+a)<<'\n';
    }
  }

}

namespace Sub2{
  ll ans[N];
  struct Nod{
    int v;
    ll w;
  };
  vector<Nod> E[N];
  bool vis[N];
  
  void dij(){
    priority_queue<pair<int,int> > Q;
    for(int i=1;i<=n;i++) ans[i]=(ll)1e18;
    ans[1]=0;
    Q.push({0,1});
    while(!Q.empty()){
	  int u=Q.top().second;Q.pop();
	  if(vis[u]) continue;
	  vis[u]=true;
	  for(auto i:E[u]){
	    if(ans[i.v]>ans[u]+i.w) ans[i.v]=ans[u]+i.w,Q.push({-ans[i.v],i.v}); 
	  }
    }
  }

  void SOLVE(){
    for(int u=1;u<=n;u++){
	  for(auto v:G[u]) vis[v]=true,E[u].pb({v,a});
      for(auto v:G[u]) for(auto w:G[v]) if(!vis[w]) E[u].pb({w,b}),vis[w]=true;
	  for(auto i:E[u]) vis[i.v]=false;
	}
	dij();
	for(int i=2;i<=n;i++) cout<<ans[i]<<'\n';
  }
}

int main(){
  #ifdef H_W_Y
  freopen("edge.in","r",stdin);
  freopen("edge.out","w",stdout);
  #endif

  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>n>>m>>a>>b;
  for(int i=1,u,v;i<=m;i++) cin>>u>>v,G[u].pb(v),G[v].pb(u);
  if(b<2ll*a&&m!=n-1) Sub2::SOLVE();
  else Sub1::SOLVE();

  return 0;
}